﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AutomationTools.Procedimentos.Exceptions;

namespace AutomationTools.Procedimentos.Busca
{

    /// <summary>
    /// Utiliza a Lib HtmlAgilityPack para executar um XPath no HTML.
    /// Recebe:     string - Contendo o HTML a ser executado o XPath
    /// Retorna:    string[] - Contendo os resultados do XPath
    /// </summary>
    public class EncontrarTagHTMLByXPath : IProcedimento
    {
        string xpath;
        /// <summary>
        /// Utiliza a Lib HtmlAgilityPack para executar um XPath no HTML.
        /// </summary>
        /// <param name="xpath">XPath a ser executada no corpo do HTML recebido.</param>
        public EncontrarTagHTMLByXPath(string xpath)
        {
            this.xpath = xpath;
        }

        public object Executar(IContexto contexto)
        {
            ValidarEntrada(contexto);

            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(((string)contexto.Parametro));
            var noos = doc.DocumentNode.SelectNodes(xpath);
            if (noos == null || noos.Count == 0)
                throw new Exception(string.Format("Não foram encontrados nós que correspondam à XPath '{0}'", xpath));
            var lista = noos.Select(x => x.OuterHtml).ToArray();
            return lista;
        }

        public void ValidarEntrada(IContexto contexto)
        {
            if (!(contexto.Parametro is string))
            {
                throw new ParametroException(typeof(string), contexto.Parametro.GetType());
            }
        }
    }
}
